#float.h
这个头文件提供 浮点数类型的范围 的相关功能,例如获取浮点数的最大值、最小值、最小单位等。
示例:
#include <stdio.h>
#include <float.h>
#include <math.h>
void print_float_properties() {
printf("\n=== float (32-bit) 属性 ===\n");
printf("FLT_RADIX (基数): %d\n", FLT_RADIX);
printf("FLT_MANT_DIG (尾数位数): %d\n", FLT_MANT_DIG);
printf("FLT_DIG (十进制精度): %d\n", FLT_DIG);
printf("FLT_MIN_EXP (最小指数): %d\n", FLT_MIN_EXP);
printf("FLT_MAX_EXP (最大指数): %d\n", FLT_MAX_EXP);
printf("\n-- 范围 --\n");
printf("FLT_MIN (最小正规化正数): %e\n", FLT_MIN);
printf("FLT_TRUE_MIN (最小正非零值): %e\n", FLT_TRUE_MIN);
printf("FLT_MAX (最大有限正数): %e\n", FLT_MAX);
printf("\n-- 精度 --\n");
printf("FLT_EPSILON (1与大于1的最小值差): %e\n", FLT_EPSILON);
printf("FLT_DECIMAL_DIG (无损十进制位数): %d\n", FLT_DECIMAL_DIG);
printf("\n-- 特殊值 --\n");
printf("INFINITY (无穷大): %f\n", INFINITY);
printf("NAN (非数字): %f\n", NAN);
}
void print_double_properties() {
printf("\n=== double (64-bit) 属性 ===\n");
printf("DBL_MANT_DIG (尾数位数): %d\n", DBL_MANT_DIG);
printf("DBL_DIG (十进制精度): %d\n", DBL_DIG);
printf("DBL_MIN_EXP (最小指数): %d\n", DBL_MIN_EXP);
printf("DBL_MAX_EXP (最大指数): %d\n", DBL_MAX_EXP);
printf("\n-- 范围 --\n");
printf("DBL_MIN (最小正规化正数): %e\n", DBL_MIN);
printf("DBL_TRUE_MIN (最小正非零值): %e\n", DBL_TRUE_MIN);
printf("DBL_MAX (最大有限正数): %e\n", DBL_MAX);
printf("\n-- 精度 --\n");
printf("DBL_EPSILON (1与大于1的最小值差): %e\n", DBL_EPSILON);
printf("DBL_DECIMAL_DIG (无损十进制位数): %d\n", DBL_DECIMAL_DIG);
}
void print_ldouble_properties() {
printf("\n=== long double 属性 ===\n");
printf("LDBL_MANT_DIG (尾数位数): %d\n", LDBL_MANT_DIG);
printf("LDBL_DIG (十进制精度): %d\n", LDBL_DIG);
printf("LDBL_MIN_EXP (最小指数): %d\n", LDBL_MIN_EXP);
printf("LDBL_MAX_EXP (最大指数): %d\n", LDBL_MAX_EXP);
printf("\n-- 范围 --\n");
printf("LDBL_MIN (最小正规化正数): %Le\n", LDBL_MIN);
printf("LDBL_TRUE_MIN (最小正非零值): %Le\n", LDBL_TRUE_MIN);
printf("LDBL_MAX (最大有限正数): %Le\n", LDBL_MAX);
printf("\n-- 精度 --\n");
printf("LDBL_EPSILON (1与大于1的最小值差): %Le\n", LDBL_EPSILON);
printf("LDBL_DECIMAL_DIG(无损十进制位数): %d\n", LDBL_DECIMAL_DIG);
}
int main() {
printf("系统浮点数属性 (精确值):\n");
print_float_properties();
print_double_properties();
print_ldouble_properties();
// 额外补充十六进制表示
printf("\n=== 十六进制精确表示 ===\n");
printf("FLT_MIN: %a\n", FLT_MIN);
printf("FLT_TRUE_MIN: %a\n", FLT_TRUE_MIN);
printf("DBL_MIN: %a\n", DBL_MIN);
printf("DBL_TRUE_MIN: %a\n", DBL_TRUE_MIN);
return 0;
}
运行结果:
系统浮点数属性 (精确值): === float (32-bit) 属性 === FLT_RADIX (基数): 2 FLT_MANT_DIG (尾数位数): 24 FLT_DIG (十进制精度): 6 FLT_MIN_EXP (最小指数): -125 FLT_MAX_EXP (最大指数): 128 -- 范围 -- FLT_MIN (最小正规化正数): 1.175494e-38 FLT_TRUE_MIN (最小正非零值): 1.401298e-45 FLT_MAX (最大有限正数): 3.402823e+38 -- 精度 -- FLT_EPSILON (1与大于1的最小值差): 1.192093e-07 FLT_DECIMAL_DIG (无损十进制位数): 9 -- 特殊值 -- INFINITY (无穷大): inf NAN (非数字): nan === double (64-bit) 属性 === DBL_MANT_DIG (尾数位数): 53 DBL_DIG (十进制精度): 15 DBL_MIN_EXP (最小指数): -1021 DBL_MAX_EXP (最大指数): 1024 -- 范围 -- DBL_MIN (最小正规化正数): 2.225074e-308 DBL_TRUE_MIN (最小正非零值): 4.940656e-324 DBL_MAX (最大有限正数): 1.797693e+308 -- 精度 -- DBL_EPSILON (1与大于1的最小值差): 2.220446e-16 DBL_DECIMAL_DIG (无损十进制位数): 17 === long double 属性 === LDBL_MANT_DIG (尾数位数): 64 LDBL_DIG (十进制精度): 18 LDBL_MIN_EXP (最小指数): -16381 LDBL_MAX_EXP (最大指数): 16384 -- 范围 -- LDBL_MIN (最小正规化正数): 3.362103e-4932 LDBL_TRUE_MIN (最小正非零值): 3.645200e-4951 LDBL_MAX (最大有限正数): 1.189731e+4932 -- 精度 -- LDBL_EPSILON (1与大于1的最小值差): 1.084202e-19 LDBL_DECIMAL_DIG(无损十进制位数): 21 === 十六进制精确表示 === FLT_MIN: 0x1p-126 FLT_TRUE_MIN: 0x1p-149 DBL_MIN: 0x1p-1022 DBL_TRUE_MIN: 0x0.0000000000001p-1022
#宏
宏 | 标准 | 说明 |
---|---|---|
FLT_RADIX | C89 | 所有三种浮点类型表示所使用的基数,通常为 2 即二进制 |
DECIMAL_DIG | C99 | long double 在十进制和二进制浮点表示之间无损转换所需的十进制小数位数 |
FLT_DECIMAL_DIG | C11 | float 在十进制和二进制浮点表示之间无损转换所需的十进制小数位数,至少为 6, IEEE 定义为 9 |
DBL_DECIMAL_DIG | C11 | double 在十进制和二进制浮点表示之间无损转换所需的十进制小数位数,至少为 10, IEEE 定义为 17 |
LDBL_DECIMAL_DIG | C11 | long double 在十进制和二进制浮点表示之间无损转换所需的十进制小数位数,至少为 10, IEEE 未定义,通常为 21 |
FLT_MIN | C89 | float 的最小值正规化正值,通常为 |
DBL_MIN | C89 | double 的最小值正规化正值,通常为 |
LDBL_MIN | C89 | long double 的最小值正规化正值,通常为 |
FLT_TRUE_MIN | C11 | float 的最小值正值,通常为 |
DBL_TRUE_MIN | C11 | double 的最小值正值,通常为 |
LDBL_TRUE_MIN | C11 | long double 的最小值正值,通常为 |
FLT_MAX | C89 | float 的最大有限值 |
DBL_MAX | C89 | double 的最大有限值 |
LDBL_MAX | C89 | long double 的最大有限值 |
FLT_EPSILON | C89 | float 的最小增量 |
DBL_EPSILON | C89 | double 的最小增量 |
LDBL_EPSILON | C89 | long double 的最小增量 |
FLT_DIG | C89 | float 在文本和二进制浮点表示之间无损转换所需的十进制小数位数 |
DBL_DIG | C89 | double 在文本和二进制浮点表示之间无损转换所需的十进制小数位数 |
LDBL_DIG | C89 | long double 在文本和二进制浮点表示之间无损转换所需的十进制小数位数 |
FLT_MANT_DIG | C89 | float 采用 FLT_RADIX 进制时的小数位数 |
DBL_MANT_DIG | C89 | double 采用 FLT_RADIX 进制时的小数位数 |
LDBL_MANT_DIG | C89 | long double 采用 FLT_RADIX 进制时的小数位数 |
FLT_MIN_EXP | C89 | float 正规化值能使用的最小指数(以 FLT_RADIX 为底) |
DBL_MIN_EXP | C89 | double 正规化值能使用的最小指数(以 FLT_RADIX 为底) |
LDBL_MIN_EXP | C89 | long double 正规化值能使用的最小指数(以 FLT_RADIX 为底) |
FLT_MIN_10_EXP | C89 | float 正规化值能使用的最小指数(以 10 为底) |
DBL_MIN_10_EXP | C89 | double 正规化值能使用的最小指数(以 10 为底) |
LDBL_MIN_10_EXP | C89 | long double 正规化值能使用的最小指数(以 10 为底) |
FLT_MAX_EXP | C89 | float 正规化值能使用的最大指数(以 FLT_RADIX 为底) |
DBL_MAX_EXP | C89 | double 正规化值能使用的最大指数(以 FLT_RADIX 为底) |
LDBL_MAX_EXP | C89 | long double 正规化值能使用的最大指数(以 FLT_RADIX 为底) |
FLT_MAX_10_EXP | C89 | float 正规化值能使用的最大指数(以 10 为底) |
DBL_MAX_10_EXP | C89 | double 正规化值能使用的最大指数(以 10 为底) |
LDBL_MAX_10_EXP | C89 | long double 正规化值能使用的最大指数(以 10 为底) |
FLT_ROUNDS | C89 | 舍入模式,参考 fenv.h |
FLT_EVAL_METHOD | C99 | 所有浮点运算的精度 |
FLT_HAS_SUBNORM | C11(在 C23 废弃) | float 是否支持非正规数 |
DBL_HAS_SUBNORM | C11(在 C23 废弃) | double 是否支持非正规数 |
LDBL_HAS_SUBNORM | C11(在 C23 废弃) | long double 是否支持非正规数 |